<?php

/**
 * Recebe uma lista de elementos e os coloca de forma aninhada.
 *
 * @param array $lista       Lista de elementos a ser aninhada
 * @param string $chave      Indice que contem o valor padrao (codcategoria, por exemplo)
 * @param string $chavePai   Indice que contem o valor do codigo pai (codpai, por exemplo)
 * @param string $propFilhos Novo indice a ser gerado que armazenara os elementos aninhados
 * @return array Lista com os elementos aninhados
 * @author Hugo Ferreira da Silva
 */
function fncAninharElementos( array $lista, $chave, $chavePai, $propFilhos = '_filhos' )
{
	
	// 1 - colocando os itens indexados pelo codigo principal
	$tmp = array();
	foreach( $lista as $item ) {
		$tmp[$item[$chave]] = $item;
	}
	
	// 2 - colocando um item dentro do outro,
	// conforme pais e filhos
	/*foreach($tmp as &$item){
		if(!empty($item[$chavePai])){
			$tmp[$item[$chavePai]][$propFilhos][] = &$item;
		}
	}*/
	
	// 3 - deixando somente os itens que nao tem pai
	$nova = array();
	foreach( $tmp as $node ) {
		//if(empty($node[$chavePai])){
		$nova[] = $node;
		//}
	}
	
	// pronto, retornando os elementos
	return $nova;
}

/**
 * Função para gerar um HTML a partir de um modelo de uma lista aninhada
 *
 * @param array $lista Lista de elementos aninhados
 * @param string $tpl Modelo para aplicar as substituições
 * @param string $nomeIndice Nome do indice do array que contém elementos filhos
 * @param string $indentString String usada para indentação
 * @param int $level Nivel atual do laço
 * @return Ambigous <string, mixed>
 * @author Hugo Ferreira da Silva
 */
function fncImprimeConteudoAninhado( array $lista, $tpl, $nomeIndice, $indentString = ' ', $level = 0, $strAbertura = '', $strFechamento = '' )
{
	$str = '';
	foreach( $lista as $item ) {
		$item['_indent'] = str_repeat( $indentString, $level );
		
		$str .= preg_replace( '@:(\w+)\b@e', 'isset($item["$1"]) ? $item["$1"] : ":$1"', $tpl );
		
		if( ! empty( $item[$nomeIndice] ) ) {
			$filho = $strAbertura;
			$filho .= fncImprimeConteudoAninhado( $item[$nomeIndice], $tpl, $nomeIndice, $indentString, $level + 1, $strAbertura, $strFechamento );
			$filho .= $strFechamento;
			
			if( strpos( $str, ':_conteudoFilho' ) !== false ) {
				$str = str_replace( ':_conteudoFilho', $filho, $str );
			} else {
				$str .= $filho;
			}
		}
		
		// tirando o lixo
		$str = preg_replace( '@:(\w+)\b@', '', $str );
	}
	
	return $str;
}

function echoVarDump( $varEcho )
{
	echo "<pre>";
	var_dump( $varEcho );
	echo "</pre>";
}

function getTimestamp()
{
	return mktime( date("H"), date("i"), date("s"), date("m")  , date("d"), date("Y") );
}

function getDatetimeNow()
{
	return new \DateTime( "now" );
}

function populateForm( $obj, $post, $arrayNotInclude = null )
{
    if( $arrayNotInclude != null ) {
        foreach( $post as $field => $val ){
            if( property_exists( get_class( $obj ), $field ) ) {
            //if(!in_array($field, $arrayNotInclude)) {
                $field = "set_".$field;
                $obj->$field($val);
            }
        }
    } else {
        foreach($post as $field => $val){
            if( property_exists( get_class( $obj ), $field ) ) {
                $field = "set_".$field;
                $obj->$field($val);
            }
        }
    }
}

function getOrgaosExpeditores()
{
    return array(
        array('sigla' => "SSP", 'nome' => "Secretaria de Segurança Pública"),
        array('sigla' => "PM", 'nome' => "Polícia Militar"),
        array('sigla' => "PC", 'nome' => "Policia Civil"),
        array('sigla' => "CNT", 'nome' => "Carteira Nacional de Habilitação"),
        array('sigla' => "DIC", 'nome' => "Diretoria de Identificação Civil"),
        array('sigla' => "CTPS", 'nome' => "Carteira de Trabaho e Previdência Social"),
        array('sigla' => "FGTS", 'nome' => "Fundo de Garantia do Tempo de Serviço"),
        array('sigla' => "IFP", 'nome' => "Instituto Félix Pacheco"),
        array('sigla' => "IPF", 'nome' => "Instituto Pereira Faustino"),
        array('sigla' => "IML", 'nome' => "Instituto Médico-Legal"),
        array('sigla' => "MTE", 'nome' => "Ministério do Trabalho e Emprego"),
        array('sigla' => "MMA", 'nome' => "Ministério da Marinha"),
        array('sigla' => "MAE", 'nome' => "Ministério da Aeronáutica"),
        array('sigla' => "MEX", 'nome' => "Ministério do Exército"),
        array('sigla' => "POF", 'nome' => "Polícia Federal"),
        array('sigla' => "POM", 'nome' => "Polícia Militar"),
        array('sigla' => "SES", 'nome' => "Carteira de Estrangeiro"),
        array('sigla' => "SJS", 'nome' => "Secretaria da Justiça e Segurança"),
        array('sigla' => "SJTS", 'nome' => "Secretaria da Justiça do Trabalho e Segurança"),
        array('sigla' => "ZZZ", 'nome' => "Outros (inclusive exterior)")
    );
}

function objectToArray($object) {	
    $arr = array();
    for( $i = 0; $i < count( $object ); $i++ ) {
        $arr[] = get_object_vars( $object[$i] );
    }	
    return $arr;
}

function acento_retira($string) {
    $palavra = strtr($string, "áàãâéêíóôõúüçÁÀÃÂÉÊÍÓÔÕÚÜÇ ", "aaaaeeiooouucAAAAEEIOOOUUC_");
    $palavranova = str_replace("_"," ",$palavra);
    return $palavranova;
}

function isEdicao( $id_objeto ) {
    return $id_objeto != null && $id_objeto != '';
}

function formataExclusao( $id, $id_data_table ) {
    return "<span class=\"botaoExcluir\" id=\"dataTableContent_".$id_data_table."_".$id."\">Excluir</span>";
}

function isNotBlank( $valor ) {
    return $valor != null && $valor != '';
}

/*
 * Função pra codificar o valor e salvar em banco.
 * @param $valor no formato 9.999,99
 * @returns $valor codificado no formato 9999.99
 */
function valorFloatEncode( $valor )
{
    $valor_formatado = str_replace( ".", "", $valor );
    return str_replace( ",", ".", $valor_formatado );
}

/*
 * Função pra decodificar o valor obtido de banco e mostrá-lo em tela.
 * @param $valor no formato 9999.99
 * @returns $valor decodificado no formato 9.999,99
 */
function valorFloatDecode( $valor )
{
    $valor_formatado = str_replace( ".", ",", $valor );
    return substr( $valor_formatado, 0, 1 ).".".substr( $valor_formatado, 1 );
}

function criptografaSenha( $senha )
{
    return md5( $senha );
}

/*
 * Converte uma data no formato 99/99/9999 para 9999-99-99
 */
function dataToDate( $data ) {
    if( isNotBlank( $data ) ) {
        $hora = explode( " " , $data );
        $explode = explode( "/", $hora[0] );
        if( count( $explode ) == 3 ) {
            $retorno = $explode[2]."-".$explode[1]."-".$explode[0];
            if( count( $hora ) > 1 ) {
                $retorno .= " ".$hora[1];
            }
            return $retorno;
        }
    }
    return $data;
}

function dateTimeToData( $dateTime ){
    return date("d/m/Y", strtotime($dateTime));
}

/*
 * Converte uma data no formato 9999-99-99 para 99/99/9999
 */
function dateToData( $date ) {
    if( isNotBlank( $date ) ) {
        $hora = explode( " " , $date );
        $explode = explode( "-", $hora[0] );
        if( count( $explode ) == 3 ) {
            $retorno = $explode[2]."/".$explode[1]."/".$explode[0];
            if( count( $hora ) > 1 ) {
                $retorno .= " ".$hora[1];
            }
            return $retorno;
        }
    }
    return $date;
}

function getOffsetPaginacao( $page ) {
    return ( $page - 1 )*LIMITE_PAGINACAO_ADMIN;
}

function pesquisaHabilitada( $pesquisa ) {
    return isNotBlank( $pesquisa ) && $pesquisa === TRUE;
}

function required($fieldName){
    return str_replace("#field", $fieldName, MSG_REQUIRED);
}

if ( ! function_exists('get_value')){
    function get_value($entity, $field)
    {
        return $entity != null ? $entity->get_ . (string) $field : '';
    }
}